#include <assert.h>

#include <cstddef>
#include <iostream>
#include <queue>
#include <stack>
#include <string>
#include <type_traits>

class Solution {
 public:
  std::string simplifyPath(std::string path) {
    int sz = path.size();
    int i = 0;

    while (1) {
      if (path[i] == '/') {
        real_path_.push_back(path[i]);

        // 跳过所有的无效 '/'
        while (i < sz && path[i++] != '/')
          ;

        // 可能结尾
        if (i == sz) {
          // 把最后的 '/' pop_back
          real_path_.pop_back();
          break;
        }

        // 如果下一个元素是 .
        if (path[i] == '.') {
          // 则可能是回退 ../
          // 或者不变 ./
          // 或者 ... 作为目录名
          int count = 0;
          while (i < sz && path[i++] == '.') count++;
          assert(count > 0);

          // 处理结果
          // 1. 要退栈
          if (count == 2) {
            while (real_path_.back() != '/') {
              real_path_.pop_back();
            }
            // 把目录也处理了，万一是最后的路径，不能出现 '/'
            real_path_.pop_back();
          }
          //
          // 2. 当成目录处理
          else if (count == 3) {
            for (int j = 0; j < 3; ++j) {
              real_path_.push_back('.');
            }
          }
          //
          //
          else {
          }

          // 都有可能是末尾
          if (i == sz) {
            break;
          }
        }

        // 或者实际目录 : foo/
        // 同时一个难点在于目前处于循环状态，要防止其溢出。。
      }
    }
    return real_path_;
  }

 private:
  std::string real_path_;
};
